﻿using System.Threading.Tasks;

namespace Beeflys
{
    public interface IEntityRef : IActorRef
    {
        Task<IActorRef> AddChildAsync<TActor>(string name) where TActor : AActor;
        Task<IActorRef> AddChildAsync<TActor, T1>(string name, T1 item1)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2>(string name, T1 item1, T2 item2)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2, T3>(string name, T1 item1, T2 item2, T3 item3)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2, T3, T4>(string name, T1 item1, T2 item2, T3 item3, T4 item4)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2, T3, T4, T5>(string name, T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2, T3, T4, T5, T6>(string name, T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor, T1, T2, T3, T4, T5, T6, T7>(string name, T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
            where TActor : AActor, new();

        Task<IActorRef> AddChildAsync<TActor>(string host, string name) where TActor : AActor;
        
        Task<IActorRef> GetChildAsync(string name);
        
        Task<bool> DestroyChildAsync(string name);
    }
}